4 תשובות
uniqid
או
return substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',5)), 0, $length);
}
/* or: */
function uuid(){
return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
mt_rand( 0, 0x0fff ) | 0x4000,
mt_rand( 0, 0x3fff ) | 0x8000,
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ) );
}
ותגדיר במסד unique
אני הייתי הולך על עמודה עם autoincrement, עמודה עם כמה 3-4 תווים רנדומליים שכן יכולים לחזור על עצמם (salt) ועוד עמודה שהיא בעצם המחרוזת הזו שמורכבת מ
ככה לא צריך לבדוק את קיומה של מחרוזת כלשהי במסד.
@intval
מחשבה נכונה ויצירתית אבל מאוד מגבילה, sha1 מחזירה מחרוזת קבועה של 64 תווים.
אני חושב שהסיכוי שתחזור אותה מחרוזת מstrRand לא תחזיר אותה מחרוזת (אפילו בלי בדיקה במסד), כי יש 11 תווים (ברירת מחדל) בחזקת 320 תווים = (64^11) * 5 = 368,934,881,474,191,032,320 מחרוזות, (לא בטוח שזה נכון, אבל משהו בסגנון), אפילו יוטיוב עובדים ככה ויש להם מעל 2 מליארד סרטונים[*] ולא נראה לי שהמערכת שהוא בונה צריכה יותר מזה ומקסימום אם יש התנגשות יש לו unique על העמודה שתגדיר תנאי חדש משהו בסגנון הזה:
CREATE TABLE IF NOT EXISTS `test_tbl` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`rand_string` varchar(11) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `rand_string` (`rand_string`)
);
*/
function strRand($length=11){
return substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',5)), 0, $length);
}
while(1){
mysql_query(sprintf("INSERT INTO `test_tbl` (`rand_string`) VALUE ('%s');", strRand())) or die(mysql_error());
if(mysql_affected_rows() == 1){
break;
}
}
יש עוד פונקציות hashing שאפשר לקבל מהם מחרוזת בכל אורך שתרצה.
הבעיה עם strRand שבכל זאת צריך לבדוק.
למרות שאפשר לא לבדוק ופשוט לטפוס שגיאות מהמסד. וגם הרנדום הוא לא כזה רנדום ככה שלא הייתי מסתמך עליו :)
הכל תלוי בשביל מה המחרוזת הזו בכלל.
אבל באופן כללי אתה צודק.
---
אצל יוטיוב היא לא רנדומלית. זה מספר עולה באיזהשהו base256